package LimitedTimeGame.Day_0210;

/**
 * @author zxc
 * @date 2023/02/10 10:48
 **/

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 * 题目 ：二维网格迁移
 * 题目详述 ：
 * 给你一个 m 行 n列的二维网格grid和一个整数k。你需要将grid迁移k次。
 * 每次「迁移」操作将会引发下述活动：
 * 位于 grid[i][j]的元素将会移动到grid[i][j + 1]。
 * 位于grid[i][n- 1] 的元素将会移动到grid[i + 1][0]。
 * 位于 grid[m- 1][n - 1]的元素将会移动到grid[0][0]。
 * 请你返回k 次迁移操作后最终得到的 二维网格。
 *
 * 提示：
 * m ==grid.length
 * n ==grid[i].length
 * 1 <= m <= 50
 * 1 <= n <= 50
 * -1000 <= grid[i][j] <= 1000
 * 0 <= k <= 100
 *
 */
public class ShiftGrid02 {
    /**
     * @param grid
     * @param k
     * @return
     */
    public static List<List<Integer>> shiftGrid(int[][] grid, int k) {
        int len = grid.length;
        int col = grid[0].length;
        List<List<Integer>> result = new ArrayList<>();
        // 首先，填满Result集合，以便后续进行迁移操作;
        // 注意 ：向集合中插入元素的话，需要保证集合中所要插入元素位置的前面不为null;
        for(int i = 0 ; i < len ; i++){
            List<Integer> list = new ArrayList<>();
            for(int j = 0 ; j < col ; j++){
                list.add(grid[i][j]);
            }
            result.add(list);
        }
        // 其次，向Result集合中的元素进行迁移
        for(int i = 0 ; i < len ; i++){
            for(int j = 0 ; j < col ; j++){
                // 当前元素grid[i][j],在迁移之后在所有元素中的排序序号;
                int index = (i * col + j + k) % (len * col);
                // （1）result集合中，获取指定索引(index / col)集合list;
                // （2）在集合list中，对于(index % col)的元素设置为 刚刚进行迁移的grid[i][j];
                result.get(index / col).set(index % col , grid[i][j]);
            }
        }
        // 返回结果集合;
        return result;
    }
}
